Apollo Server
code:schema.gql
type PostTag {
name: String!
}
type Post {
id: ID!
title: String!
body: String!
}
interface User {
name: String!
}
type Author implements User {
name: String!
}
type Query {
}
parent
親 Resolver の戻り値
Root Resolver 直下の場合は空になる
args
context
GraphQL 操作全体で共有されるオブジェクト
DB コネクションやユーザの認証情報など、任意のデータを持たせることができる
info
その他の実行される操作に関する詳細情報
デバッグやエラー通知に含めるメッセージの生成などに用いられる
e.g.
code:src/index.ts
const resolvers = {
Query: {
authors: () =>
Object.entries(db.users).map((id, user) => ({ id, ...user })), },
Post: {
tags: ({ tags }) => tags.map((name) => ({ name })),
},
Author: {
posts: ({ id }) =>
Object.entries(db.blogs)
.filter((post) => post.author === id)
},
};
Default resolvers
もし特定のフィールドに対してリゾルバを定義していない場合、Apollo Server はそのフィールドに対して Default resolvers を適用する
Default resolvers では、親のオブジェクトがフィールド名と同じプロパティを持つ場合にその値を返す
これにより、Post.title や Author.name などは Resolver を定義しなくても期待通りの値を返すようになる サーバの起動
startStandaloneServer を用いることで、簡単にサーバを立ち上げることができる
code:src/index.ts
import { addResolversToSchema } from "@graphql-tools/schema";
import { ApolloServer } from "@apollo/server";
import { startStandaloneServer } from "@apollo/server/standalone";
const schemaWithResolvers = addResolversToSchema({ schema, resolvers });
const apolloServer = new ApolloServer({ schema: schemaWithResolvers });
const { url } = await startStandaloneServer(apolloServer);
console.log(url);
https://scrapbox.io/files/66f1739c8f3872001de04652.png
Resolver chains
Root resolver から GraphQL Schema の最下層の Resolver まで処理が連鎖される仕組みや実行される順序のこと これにより、GraphQL サーバはクライアントが指定したクエリを正しい順序で取得して返すことを保証する また、GraphQL サーバは AST と GraphQL Schema を比較し、クエリの有効性をチェックする 無効な場合、Resolver を実行することなくクライアントにエラーを返す
e.g.
code:gql
query GetPosts {
authors {
posts {
tags {
name
}
}
}
}
実行される Resolver の順序
code:mmd
code:mermaid
flowchart LR
Query.authors --> Author.posts --> Post.tags --> PostTag.name
e.g. 2
code:gql
query GetPosts {
authors {
name
posts {
title
body
tags {
name
}
}
}
}
実行される Resolver の順序
code:mermaid
flowchart LR
Query.authors --> Author.name
Query.authors --> Author.posts
Author.posts --> Post.tags --> PostTag.name
Author.posts --> Post.title
Author.posts --> Post.body
分岐したそれぞれのサブチェーンの Resolver は 並列 で実行される